package client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class ChatClientPresenter {
	private boolean connected = false;
	private OutputStream os;
	private BufferedReader br;
	private Socket connectionSocket;
	private ChatClientGUI servedGUI;
	
	public ChatClientPresenter(ChatClientGUI g){
		servedGUI = g;
	}
	
	public void tryConnection(String host, int port, String name){
		if(!connected){
			try {
				connectionSocket = new Socket(host, port);
				os = connectionSocket.getOutputStream();
				NachrichtenBauer b = new NachrichtenBauer(Befehl.connect,name);
				byte[] text = b.toString().getBytes();
				os.write(text);
			} catch (UnknownHostException e) {
				servedGUI.updateChat("Verbindungs Fehler: Host nicht gefunden.");
				return;
			} catch (IOException e) {
				servedGUI.updateChat("Verbindungs Fehler: Verbindungsversuch verweigert. Bitte geben Sie den Port eines gueltigen Chat-Servers ein.");
				return;
			} 
			ChatClientReceiver rc = new ChatClientReceiver();
			rc.start();
		}else{
			servedGUI.updateChat("Verbindung besteht bereits. Bitte trennen Sie die Verbindung, wenn Sie eine neue aufbauen moechten.");
		}
	}

	public void sendMessage(String text) {
		if(connected){
			NachrichtenBauer b = new NachrichtenBauer(Befehl.message,text);
			byte[] nachricht = b.toString().getBytes();
			try {
				os.write(nachricht);
			} catch (IOException e) {
				servedGUI.updateChat("Verbindung vom Server getrennt.");
				connected = false;
			}
		}else{
			servedGUI.updateChat("Fehler: Keine Verbindung zu einem Chat-Server.");
		}
	}
	
	public void disconnect(){
		if(connected){
			NachrichtenBauer b = new NachrichtenBauer(Befehl.disconnect,"");
			byte[] nachricht = b.toString().getBytes();
			try {
				os.write(nachricht);
			} catch (IOException e) {
				servedGUI.updateChat("Verbindung vom Server getrennt.");
				connected = false;
			}
		}else{
			servedGUI.updateChat("Es besteht keine Verbindung.");
		}
	}
	private class ChatClientReceiver extends Thread{
		@Override
		public void run(){
			try {
				br = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
			} catch (IOException e) {
				e.printStackTrace();
			}
			while(true){
				try {
					String nachricht = br.readLine();
					if(nachricht.equalsIgnoreCase("connect:ok")){
						connected = true;
						servedGUI.updateChat("Verbunden mit Chat-Server.");
					}else if(nachricht.startsWith("refused:")){
						if(nachricht.equalsIgnoreCase("refused:too_many_users")){
							servedGUI.updateChat("Verbindung fehlgeschlagen: Server ist voll. Waehlen Sie einen anderen Server oder probieren Sie es spaeter erneut.");
							break;
						}else if(nachricht.equalsIgnoreCase("refused:name_in_use")){
							servedGUI.updateChat("Verbindung fehlgeschlagen: Name wird bereits benutzt. Bitte einen anderen Namen waehlen.");
							break;
						}else if(nachricht.equalsIgnoreCase("refused:invalid_name")){
							servedGUI.updateChat("Verbindung fehlgeschlagen: Ungueltiger Name. Bitte einen anderen Namen waehlen.");
							break;
						}
					}else if(nachricht.startsWith("namelist:")){
						String[] namensArray = nachricht.split(":");
						StringBuilder userList = new StringBuilder();
						for(int i = 1; i < namensArray.length; i++){
							userList.append(namensArray[i]+"\n");
						}
						servedGUI.updateUserList(userList.toString());
					}else if(nachricht.startsWith("message:")){
						String[] nachrichtArray = nachricht.split(":");
						servedGUI.updateChat("<"+nachrichtArray[1]+">"+nachrichtArray[2]);
					}else if(nachricht.startsWith("disconnect:")){
						connected = false;
						servedGUI.updateChat("Verbindung unterbrochen.");
						servedGUI.updateUserList("");
						break;
					}
				} catch (IOException e) {
					servedGUI.updateChat("Verbindung unterbrochen.");
					servedGUI.updateUserList("");
					connected = false;
					break;
				}
			}
		}
	}
}


